问题
我定义了一个环境来自动对整个文档中的例句进行编号。它使用表格环境并使用自定义计数器自动对每行的第一列进行编号。我有理由不使用列表或定理计数器。
我想标记和引用表格行,以便显示与该行关联的数字。使用\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/9075和https://tex.stackexchange.com/a/54892/9075。