文中引用表格中的数字

文中引用表格中的数字

我想知道是否可以在文内交叉引用表格中的特定数字,这样,每当我在文中引用的数字在表格中发生变化时,文内数字也会随之变化?在我的文章中,我必须反复引用表格中的特定总和。问题是,由于用于得出总和的元素不断改变,我必须手动更改文内数字几次。我担心我可能会错过更正一些文内数字。举个例子,假设表 1 采用以下形式

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

在表 1 中,总和等于 5。

当我反复提及类似的总数时,我希望得到类似的解决方案:

“表 1 显示总和等于 \ref{表 1 中的总和}”

,其中我已将表 1 中的 5 的数字“标记为”表 1 中的总和。(我想举一个例子,但我认为这是不可能的)最后,我希望得到一个更“通用的解决方案”,因为我的实际论文中有几个“这种类型”的表格。

答案1

在您的问题文本中,您使用环境array来创建表格。但环境array用于在数学模式下创建矩阵。我建议不要滥用环境array来创建表格,而应使用tabular环境来创建表格。


通过包参考值您可以轻松地引入自己的交叉引用系统,类似于LaTeX 2ε 内核中实现的\label-机制:\ref

以下示例定义

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

\RetrieveNumber{⟨ID/label⟩}


2020年11月5日编辑:

我 (Ulrich Diez) 忽略了“数字”并不意味着“整数”。
\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}

由于数字的存储和检索实现方式与LaTeX 2ε 内核的机制类似,因此您需要至少编译文档两次,直到所有内容匹配为止,\label并且\ref??文档中所有位置均被正确的编号替换。如果包 hyperref 正在使用而包书签未加载,则需要编译文档至少三次。

在我的示例中,我加载了 textcase 包。它提供了防止字符大写/小写的方法。

对于像 article 这样的文档类,它会\pagestyle{headings}自动创建带有大写字母的章节标题的页眉,这是为了防止表示要检索的引用标签或数字的名称的字符大写。否则,页眉内\Retrievenumber{sum in table 1}会变成\Retrievenumber{SUM IN TABLE 1},这将是一个问题,因为(与数字“表 1 中的总和”不同)数字“表 1 中的总和”从未被存储。

在此处输入图片描述

书签如下所示:

在此处输入图片描述

相关内容