我有一个清单:
\begin{enumerate}[label={[\Roman*]},ref={[\Roman*]}]
\item\label{item1} The first item.
\end{enumerate}
我想要实现的是:
在大多数情况下,我希望通过上面指定的格式引用列表中的项目(即:\ref{item1}
通常应产生“[I]”)。但是,在少数特定情况下,我希望通过自定义引用格式引用项目(更具体地说,不使用方括号,而是使用“1”而不是“[1]”),但我仍然希望编号是自动的(否则,我可以使用,例如\hyperref[item1]{1}
引用)。因此,我想定义一个新命令,\nobracketsref
使其\nobracketsref{item1}
产生“1”。
如何实现?如能得到任何帮助我将不胜感激。
PS. 在这种情况下,有一个变化可能会影响解决方案:我有两个.tex
文件,因此列表在一个文件(列表文档)中,而我从另一个文件(主文档)中引用其项目。
这是通过包含在主文档的序言中的通常方式完成的:
\usepackage{xr-hyper}
\usepackage{hyperref}
\externaldocument{the_list_document.tex}
答案1
定义ref=
使用宏,而不是显式的括号;当不需要括号时,可以重新定义这样的宏以不执行任何操作。
\documentclass{article}
\usepackage{enumitem,xparse}
\usepackage[colorlinks]{hyperref}
\makeatletter
\NewDocumentCommand{\nobracketref}{sm}{%
\begingroup\let\bracketref\@firstofone
\IfBooleanTF{#1}{\ref*{#2}}{\ref{#2}}%
\endgroup
}
\makeatother
\NewDocumentCommand{\bracketref}{m}{[#1]}
\begin{document}
\begin{enumerate}[label={[\Roman*]},ref={\bracketref{\Roman*}}]
\item\label{item1} The first item.
\end{enumerate}
With brackets: \ref{item1} (link)
With brackets: \ref*{item1} (no link)
Without brackets: \nobracketref{item1} (link)
Without brackets: \nobracketref*{item1} (no link)
\end{document}
我认为xr-hyper
这不是什么值得担心的事情。
答案2
您有以下几种选择:
使用分隔参数删除括号。
创建一个新的
\label
,用来\Roman
代替[\Roman]
。
第一种方案由您自己\nobracketsref{<label>}
选择来实现。第二种方案由 来实现\speciallabel{<what>}{<label>}
。<what>
这里 设置为\Roman{enumi}
,因为enumi
是 中的一级计数器enumerate
。
\documentclass{article}
\usepackage{enumitem,hyperref,refcount}
\makeatletter
\newcommand*{\speciallabel}[2]{{%
\protected@edef\@currentlabel{#1}% Update the current label
\label{#2}% \label item
}}
\def\@removebrackets[#1]{#1}
\newcommand*{\nobracketsref}[1]{{%
\edef\@nobracketsref{\getrefnumber{#1}}% Retrieve reference
\expandafter\edef\expandafter\@nobracketsref\@nobracketsref% Strip outer group
\expandafter\edef\expandafter\@nobracketsref\expandafter{\expandafter\@removebrackets\@nobracketsref}% Strip [.]
\hyperref[#1]{\@nobracketsref}% Reference
}}
\makeatother
\begin{document}
\begin{enumerate}[label={[\Roman*]},ref={[\Roman*]}]
\item\label{item1}\speciallabel{\Roman{enumi}}{item2} The first item.
\end{enumerate}
\ref{item1} \quad \nobracketsref{item1} \quad \ref{item2}
\end{document}
答案3
这是一个基于 LuaLaTeX 的解决方案。它设置了一个名为的 LaTeX 宏\nobracketref
,该宏又调用一个名为的 Lua 函数,nobrackets
该函数删除函数参数中最外层的括号。
观察 Lua 函数是否测试交叉引用是否有效。如果无效,即如果\ref
返回??
而不是类似 的内容[I]
,\nobracketref
则打印一个空字符串。一旦正确解析了交叉引用,\nobracketref
将打印I
。
\documentclass{article}
\usepackage{enumitem,luacode}
%% Lua-side code
\begin{luacode}
function nobrackets ( s )
if string.find ( s , "%?" ) then
return ""
else
s = string.gsub ( s , "%[(.*)%]", "%1" )
return tex.sprint ( s )
end
end
\end{luacode}
%% TeX-side code
\newcommand\nobracketref[1]{%
\directlua{ nobrackets ( \luastring{\ref{#1}} ) }}
\begin{document}
\begin{enumerate}[label={[\Roman*]},ref={[\Roman*]}]
\item\label{item:1} The first item.
\end{enumerate}
Using \texttt{\textbackslash ref}: item \ref{item:1}.
Using \texttt{\textbackslash nobracketref}: item \nobracketref{item:1}.
\end{document}
需要注意的是:此解决方案(目前)与软件包不兼容。如果您需要兼容性,hyperref
请告诉我。hyperref