有没有办法将引用分配给某个内容(使用\label
),但实际上不会让它显示在文档中?我仍然想在文档的后面部分交叉引用它?
例如,我有一个名为的计数器\productitem
,我想做这样的事情:
\productitem\label{initialitem}\\ %Lorem ipsum
然后在文档的后面:
\ref{initialitem} is sold...
现在此代码将打印 的参考编号initialitem
,然后稍后引用该编号。但是,我不希望打印初始参考编号,也不希望为其留出任何空格或任何空行。
我知道您可能想知道我为什么要这样做。我正在制作产品列表;初始产品不可用(或与特定列表无关),因此无法列出。但是,确实需要列出它的变体。我想使用初始产品的参考编号作为变体产品编号的基础。
答案1
您可以定义一个计数器并让\productitem
该\refstepcounter
计数器:
\documentclass{article}
\newcounter{productitem}
\makeatletter
\newcommand{\productitem}{\@bsphack\refstepcounter{productitem}\@esphack}
\makeatother
\begin{document}
\productitem\label{initialitem}
See item \ref{initialitem}.
\end{document}
如果仅使用\productitem
是设置一个新产品,并且将总是后面跟着一个\label
,最好(也更方便)设置一个宏来执行这两项操作:
\documentclass{article}
\newcounter{productitem}
\newcommand{\productitem}{\refstepcounter{productitem}\label}
\begin{document}
\productitem{initialitem}
See item \ref{initialitem}.
\end{document}
答案2
该命令的一个明显修改\refstepcounter
是将当前引用设置为给定计数器的值,而不增加它;然后\label
可以像往常一样发出以捕获当前引用值。以下是此技术的一个示例:
% My standard header for TeX.SX answers:
\documentclass[a4paper]{article} % To avoid confusion, let us explicitly
% declare the paper format.
\usepackage[T1]{fontenc} % Not always necessary, but recommended.
% End of standard header. What follows pertains to the problem at hand.
\makeatletter
% Define core functionality:
\newcommand*\refbutnotstepcounter[1]{%
\protected@edef\@currentlabel
{\csname p@#1\endcsname\csname the#1\endcsname}%
}
\makeatother
% Define handy shortcut:
\newcommand*{\photocnt}[2]{%
\refbutnotstepcounter{#1}\label{#2}%
}
% Test counter:
\newcounter{FOO}
\begin{document}
\setcounter{FOO}{123}\photocnt{FOO}{value-1}
\addtocounter{FOO}{300}\photocnt{FOO}{value-2}
The first value was $\ref{value-1}$, the second (and current) value is
$\ref{value-2}$.
\stepcounter{FOO}\photocnt{FOO}{value-3}
\setcounter{FOO}{-1}
In mid-paragraph \photocnt{FOO}{value-4} too.
\addtocounter{FOO}{100}\photocnt{FOO}{value-5}
We have now three more ``photographs'': $\ref{value-3}$, $\ref{value-4}$, and
$\ref{value-5}$.
\end{document}