
Мне было интересно, возможно ли сделать внутритекстовую перекрестную ссылку на определенное число в Таблице, так чтобы внутритекстовое число изменялось всякий раз, когда число, на которое я ссылаюсь в тексте, изменяется в Таблице? В моем тексте мне неоднократно приходится ссылаться на определенную сумму в таблице. Проблема в том, что, поскольку элементы, используемые для вывода суммы, постоянно изменяются, мне приходится вручную изменять внутритекстовое число несколько раз. Я боюсь, что могу упустить исправление некоторых внутритекстовых чисел. Приводя пример, предположим, что Таблица 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" никогда не сохранялось.
Закладки выглядят так: