我定义如下:
\newcounter{testCounter}
\newcommand{\testCommand}[1]{
\setcounter{testCounter}{#1}
Your number is \ref{testCounter}!
}
现在我想在文档中调用这个命令:
\begin{document}
\testCommand{12}
\end{document}
我希望这能给我带来:
你的号码是12!
但是,我得到了错误,
“存在未定义的引用。”
有人能向我解释为什么这不起作用吗?这似乎很简单...我也在使用以下软件包:
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{marvosym}
\usepackage{lmodern}
\usepackage{parskip}
\usepackage{pifont}
\usepackage{calc}
\usepackage{nameref}
谢谢!
答案1
您想打印存储在计数器中的数字:使用\thetestCounter
或\arabic{testCounter}
任何用 定义的计数器\newcounter
都会获得一个关联的宏\theX
,该宏默认为\arabic{X}
,即\newcounter{foo}
定义\thefoo
,用阿拉伯数字打印计数器值。
如果要使用参考,则需要另一种方法,请参阅\otherCommand
,其中将计数器设置为减一的值,然后\refstepcounter
应用,立即使用\label
来“冻结”计数器参考值。
这被写入.aux
文件并可以在第二次运行中加载并从一开始就引用!
\documentclass{article}
\newcommand{\myconstant}{4}
\newcounter{testCounter}
\newcommand{\testCommand}[1]{%
\setcounter{testCounter}{#1}%
Your number is: \thetestCounter%
}
\newcommand{\otherCommand}[1]{%
%Does not need calc package
\setcounter{testCounter}{\numexpr#1-1}%
\refstepcounter{testCounter}%
}
\begin{document}
Later on, you will set the counter to \ref{somelabel}
\testCommand{12}
\testCommand{\numexpr12*\myconstant}
\otherCommand{1001}\label{somelabel}
\end{document}
答案2
\ref
erences 与\label
s 一起工作,因此为了使用任何\ref
,您必须在某处有一个伴随\label
。此外,\label
只抓取特定类型的可引用对象(是的,主要是计数器,但那些已经“以特定方式调整”的对象;见了解引用和标签的工作原理)。
在您的示例中,使用更简单
\newcommand{\testCommand}[1]{%
Your number is #1!%
}
不带\ref
。如果你想对数字进行计算,你可以使用一个包。也许像
\documentclass{article}
\usepackage{xfp}
\newcommand{\testCommand}[1]{%
Your number is \fpeval{#1}!%
}
\begin{document}
\testCommand{12}
\testCommand{12 * 3}
\testCommand{12 / 4}
\end{document}