我正在尝试创建以下内容,但无法在这里或其他网上找到任何内容......
我想创建一个带有自定义计数器的方程式,然后在该方程式中使用计数器时调用计数器的值。例如,请考虑以下情况。
\newcounter{opt}
\[
ax + b = c
\refstepcounter{opt}
\label{eq:1}
\]
\ref{eq:1}
正如我所期望的,最后的\ref
调用产生了值1
。但是,我想用非标准标签标记方程式,例如\tag*{$(P_1)$}
。我可以按如下方式执行此操作。
\newcounter{opt}
\[
ax + b = c
\refstepcounter{opt}
\label{eq:1}
\tag*{$(P_\theopt)$}
\]
\ref{eq:1}
这给出了正确的标签,但是现在\ref
调用会产生(P_1)
,而不仅仅是1
。
我该如何调整才能得到想要的标签和我可以参考方程式并得到计数器的值吗?
这, ”参考此时计数器的标签和值“,是一篇高度相关的帖子。它做的事情比我想做的更深入一些,我无法很好地理解发生了什么,无法适应它……
如果有帮助,上下文如下。我有一个优化问题,我想用同一个计数器标记两个方程(P_1)
和。然后我想将其称为;我打算通过编写来做到这一点。(C_1)
opt
(P,C)_1
(P,C)_\ref{eq:1}
我想,我实际上想要做的就是在()
等式括号中写出与我\ref
生成的值不同的内容。
如果有更好的方法可以做到这一点,我洗耳恭听!
答案1
使用受保护的命令,这样它将被写入.aux
文件中,并且您可以定义它在不同上下文中执行不同的操作。
\documentclass{article}
\usepackage{amsmath,xparse}
\newcounter{xtag}
\NewDocumentCommand{\xtag}{sm}{%
\IfBooleanF{#1}{\refstepcounter{xtag}}%
\tag{\choosetag{#2}{\thextag}}%
}
\ExplSyntaxOn
\NewDocumentCommand{\choosetag}{mm}
{
\bool_if:NTF \l_samt_choosetag_ref_bool
{
#2
}
{
$\mathrm{#1}\sb{#2}$
}
}
\NewDocumentCommand{\xref}{m}
{
\group_begin:
\bool_set_true:N \l_samt_choosetag_ref_bool
\ref{#1}
\group_end:
}
\NewDocumentCommand{\xeqref}{om}
{
\IfNoValueTF{#1}
{
\eqref{#2}
}
{
\textnormal{(#1)}$\sb{\xref{#2}}$
}
}
\bool_new:N \l_samt_choosetag_ref_bool
\ExplSyntaxOff
\begin{document}
\begin{gather}
1=1 \xtag{P} \label{a} \\
2=2 \xtag*{C} \label{b} \\
3=3 \xtag{P} \label{c}
\end{gather}
\xeqref{a} or \xeqref[P,C]{a}
\xeqref{c}
\end{document}
命令\xtag
使计数器前进,但是变体\xtag*
却不前进。