我需要将一个整数添加到参考编号中。为了便于理解,假设我有一个练习列表,其中第一个练习有\label{exr:thisone}
(假设是编号 6),然后我想说“在练习 6、7 和 8 中...”。
为此,有一个宏可以\refplus
让我编写
in exercises \ref{exr:thisone}, \refplus{exr:thisone}{1} and \refplus{exr:thisone}{2}...
嗯,我确实有这样一个宏,如下所示。而且它有效!...除非我使用 babel 包。在下面的示例文档中,只要注释掉,一切都会按预期工作\usepackage[spanish]{babel}
。但如果我激活它,宏就会中断。
据我所知,问题在于(使用 babel)in\ref{#1}
没有\setcounter{counterforrefplus}{\ref{#1}}
返回值,因此 LaTeX 响应“缺少数字,视为零”。
有什么想法吗?具体来说,为什么 babel 会破坏宏,以及如何使宏与 babel 兼容?
\documentclass{article}
%\usepackage[spanish]{babel}
\newcounter{counterforrefplus}
\newcommand{\refplus}[2]{%
\setcounter{counterforrefplus}{\ref{#1}}% copy \ref{#1} to counter
\addtocounter{counterforrefplus}{#2}% add #2 to counter
\thecounterforrefplus}% display counter
\begin{document}
\section{First}\label{one}
Value of one = \ref{one} \\
Value of one plus 3 = \refplus{one}{3}
\end{document}
答案1
您不能依赖\ref
可扩展到数字。事实上,如果引用尚未建立,则会出错。
有了babel
,该\ref
命令就被故意弄得不可扩展。
你可以修复它refcount
:
\documentclass{article}
\usepackage[spanish]{babel}
\usepackage{refcount}
\newcounter{counterforrefplus}
\newcommand{\refplus}[2]{%
\setcounter{counterforrefplus}{\getrefnumber{#1}}% copy \ref{#1} to counter
\addtocounter{counterforrefplus}{#2}% add #2 to counter
\thecounterforrefplus}% display counter
\begin{document}
\section{First}\label{one}
Value of one = \ref{one} \\
Value of one plus 3 = \refplus{one}{3}
\end{document}
然而这不是解决方案。假设你在 6 和 7 之间添加一个练习。那么你的命令
\refplus{exr:thisone}{1} and \refplus{exr:thisone}{2}
将会偏离一个,您需要手动修复它们。
改用cleveref
。
\documentclass{article}
\usepackage[spanish]{babel}
\usepackage[spanish]{cleveref}
\newtheorem{exercise}{Ejercicio}
\crefname{exercise}{ejercicio}{ejercicios}
\begin{document}
\begin{exercise}\label{easy}
Easy.
\end{exercise}
\begin{exercise}\label{less-easy}
Less easy.
\end{exercise}
\begin{exercise}\label{though}
Tough.
\end{exercise}
\begin{exercise}\label{hey}
This is stated as an exercise, but is actually an open problem.
\end{exercise}
See \cref{easy,less-easy,hey}.
\end{document}