我想知道是否可以在文内交叉引用表格中的特定数字,这样,每当我在文中引用的数字在表格中发生变化时,文内数字也会随之变化?在我的文章中,我必须反复引用表格中的特定总和。问题是,由于用于得出总和的元素不断改变,我必须手动更改文内数字几次。我担心我可能会错过更正一些文内数字。举个例子,假设表 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 中的总和”从未被存储。
书签如下所示: