通过自动计数器引用表格行

通过自动计数器引用表格行

问题

我定义了一个环境来自动对整个文档中的例句进行编号。它使用表格环境并使用自定义计数器自动对每行的第一列进行编号。我有理由不使用列表或定理计数器。

我想标记和引用表格行,以便显示与该行关联的数字。使用\label\ref不起作用。有没有办法给函数提供两个参数,一个键和我的计数器的当前值,然后使用键来调用另一个参数?或者有其他方法可以做我想做的事情?不破坏文档其余部分的标签和引用是理想的,但不是必要的。

(非)工作示例

\documentclass{article}
\usepackage{array} %don't know why this is needed; get csname error otherwise

% automatically number examples throughout document
\newcounter{exno}
\newenvironment{examples}
{
\begin{flushleft}
\begin{tabular}{>{(\stepcounter{exno}\theexno)}rl}
}
{
\end{tabular}
\end{flushleft}
}

\begin{document}

\section{Foo}
Here are some numbered example sentences.
\begin{examples}
  &Content of row 1 \label{row1} \\
  &Content of row 2 \label{row2}
\end{examples}
Now I want to get a 1 here: \ref{row1}. I want to get a 2 here: \ref{row2}.

\end{document}

答案1

为了能够像那样引用计数器,您需要使用\refstepcounter。这将步进计数器,并告知LaTeX使用提供的计数器进行以下引用。

然后你需要替换\label's。它们需要直接指向计数器。因此你的例子将是:

\documentclass{article}
\usepackage{array} %don't know why this is needed; get csname error otherwise

% automatically number examples throughout document
\newcounter{exno}
\newenvironment{examples}
{
\begin{flushleft}
\begin{tabular}{>{(\refstepcounter{exno}\theexno)}rl}
}
{
\end{tabular}
\end{flushleft}
}

\begin{document}

\section{Foo}
Here are some numbered example sentences.
\begin{examples}
  \label{row1} &Content of row 1 \\
  \label{row2} &Content of row 2
\end{examples}
Now I want to get a 1 here: \ref{row1}. I want to get a 2 here: \ref{row2}.

\end{document}

这将产生: 例子

添加:这也可以通过加载hyperref包链接到行来实现。

答案2

这与 zeroth 的解决方案非常相似,但如果将标签定义放在其中\newenvironment会更方便。因此您不需要手动为每一行创建标签。

\documentclass{article}
\usepackage{array} %don't know why this is needed; get csname error otherwise

% automatically number examples throughout document
\newcounter{exno}
\newenvironment{examples}
{
\begin{flushleft}
\begin{tabular}{>{(\refstepcounter{exno}\theexno\label{row:\theexno}) }rl}
}
{
\end{tabular}
\end{flushleft}
}

\begin{document}

\section{Foo}
Here are some numbered example sentences.
\begin{examples}
&Content of row 1 \\
&Content of row 2
\end{examples}
Now I want to get a 1 here: \ref{row:1}. I want to get a 2 here: \ref{row:2}.

\end{document}

编辑: 在 zeroth 的评论之后,我编辑了我的帖子以展示它如何与多个示例一起工作。只需为示例环境使用另一个计数器。或者为每个环境提供一个唯一的名称(作为参数)并使用它而不是示例计数器。然后就可以引用示例和表格行。我认为很多 LaTeX 环境都是这样工作的。

\documentclass{article}
\usepackage{array} %don't know why this is needed; get csname error otherwise

% automatically number examples throughout document

%link the RowNumberCounter to the ExampleNumberCounter
\newcounter{ExampleNumber}
\newcounter{RowNumber}[ExampleNumber]

\newenvironment{examples}
{
\stepcounter{ExampleNumber}
%
\begin{flushleft}%
\begin{tabular}{>{%
(\refstepcounter{RowNumber}\theRowNumber%
\label{Example:\theExampleNumber:Row:\theRowNumber}) }rl}%
}
{%
\end{tabular}%
\end{flushleft}%
}%

\begin{document}

\section{Foo}
Here are some numbered example sentences.
\begin{examples}
&Content of row 1 \\
&Content of row 2
\end{examples}
Now I want to get a 1 here: \ref{Example:1:Row:1}. I want to get a 2 here: \ref{Example:1:Row:2}.

\begin{examples}
&Content of row 1 \\
&Content of row 2\\
&Content of row 3 \\
&Content of row 4
\end{examples}
Now I want to get a 1 here: \ref{Example:2:Row:1}. I want to get a 2 here: \ref{Example:2:Row:2}.
Now I want to get a 3 here: \ref{Example:2:Row:3}. I want to get a 4 here: \ref{Example:2:Row:4}.
\end{document}

答案3

我有以下额外要求

  • 为每一行命名标签(而不是自动生成的标签),因为我有时会交换行。
  • 允许第一列居中。
  • cleveref支持。
  • 与环境的外观相似algorithmic

我无法去cleveref上班,因此,我正在使用autoref

因此我想出了这个解决方案:

\documentclass{article}

\usepackage{array}
\usepackage{hyperref}

\newcounter{rowcount}
\setcounter{rowcount}{0}
\newcommand{\rowcountautorefname}{Line}

\begin{document}

\begin{tabular}{@{{\makebox[1.3em][r]{\footnotesize\the\numexpr\value{rowcount}+1\relax:}}\hspace*{1.5\tabcolsep}}>{\refstepcounter{rowcount}}c}
line 1 \\
long line 2 \\
\label{line3} longer line 3
\end{tabular}

\autoref{line3} shows the longest line.

\end{document}

基于https://tex.stackexchange.com/a/58139/9075https://tex.stackexchange.com/a/54892/9075

相关内容