单独出现的特殊引用样式(使用自动编号)到列表项(不改变其他出现的样式)?

单独出现的特殊引用样式(使用自动编号)到列表项(不改变其他出现的样式)?

我有一个清单:

\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

您有以下几种选择:

  1. 使用分隔参数删除括号。

  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

相关内容